<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>fdk-aac: original/libSBRdec/src/psdec.cpp File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">fdk-aac
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_ed137715e08969a186ec660e8ae6e2fb.html">original</a></li><li class="navelem"><a class="el" href="dir_222de58a05c98cc4a78309a37525cd28.html">libSBRdec</a></li><li class="navelem"><a class="el" href="dir_c997d48ad60fbe63e2ba342b9c79db98.html">src</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="summary">
<a href="#define-members">Macros</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle">
<div class="title">psdec.cpp File Reference</div>  </div>
</div><!--header-->
<div class="contents">

<p>parametric stereo decoder  
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &quot;<a class="el" href="psdec_8h_source.html">psdec.h</a>&quot;</code><br />
<code>#include &quot;FDK_bitbuffer.h&quot;</code><br />
<code>#include &quot;<a class="el" href="sbr__rom_8h_source.html">sbr_rom.h</a>&quot;</code><br />
<code>#include &quot;<a class="el" href="sbr__ram_8h_source.html">sbr_ram.h</a>&quot;</code><br />
<code>#include &quot;FDK_tools_rom.h&quot;</code><br />
<code>#include &quot;<a class="el" href="generic_stds_8h_source.html">genericStds.h</a>&quot;</code><br />
<code>#include &quot;FDK_trigFcts.h&quot;</code><br />
</div><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
Macros</h2></td></tr>
<tr class="memitem:a39a8332fdc6b5c436b43d670e2066931"><td class="memItemLeft" align="right" valign="top"><a id="a39a8332fdc6b5c436b43d670e2066931"></a>
#define&#160;</td><td class="memItemRight" valign="bottom"><b>FRACT_ZERO</b>&#160;&#160;&#160;FRACT_BITS - 1</td></tr>
<tr class="separator:a39a8332fdc6b5c436b43d670e2066931"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a5a692d4286dd5dc94b9c497ba649f4c8"><td class="memItemLeft" align="right" valign="top"><a id="a5a692d4286dd5dc94b9c497ba649f4c8"></a>
#define&#160;</td><td class="memItemRight" valign="bottom"><b>NO_HYBRID_DATA_BANDS</b>&#160;&#160;&#160;(71)</td></tr>
<tr class="separator:a5a692d4286dd5dc94b9c497ba649f4c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:aa421edb192cb1475e561cb7086d72f2a"><td class="memItemLeft" align="right" valign="top">SBR_ERROR&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#aa421edb192cb1475e561cb7086d72f2a">ResetPsDec</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> h_ps_d)</td></tr>
<tr class="memdesc:aa421edb192cb1475e561cb7086d72f2a"><td class="mdescLeft">&#160;</td><td class="mdescRight">resets some values of the PS handle to default states  <a href="psdec_8cpp.html#aa421edb192cb1475e561cb7086d72f2a">More...</a><br /></td></tr>
<tr class="separator:aa421edb192cb1475e561cb7086d72f2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ababc9e121d8507eadfe0d3603c5267ca"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#ababc9e121d8507eadfe0d3603c5267ca">CreatePsDec</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> *h_PS_DEC, int aacSamplesPerFrame)</td></tr>
<tr class="memdesc:ababc9e121d8507eadfe0d3603c5267ca"><td class="mdescLeft">&#160;</td><td class="mdescRight">Creates one instance of the <a class="el" href="struct_p_s___d_e_c.html">PS_DEC</a> struct.  <a href="psdec_8cpp.html#ababc9e121d8507eadfe0d3603c5267ca">More...</a><br /></td></tr>
<tr class="separator:ababc9e121d8507eadfe0d3603c5267ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ac038386a12ab363c54b43dda813450f0"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#ac038386a12ab363c54b43dda813450f0">DeletePsDec</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> *h_PS_DEC)</td></tr>
<tr class="memdesc:ac038386a12ab363c54b43dda813450f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete one instance of the <a class="el" href="struct_p_s___d_e_c.html">PS_DEC</a> struct.  <a href="psdec_8cpp.html#ac038386a12ab363c54b43dda813450f0">More...</a><br /></td></tr>
<tr class="separator:ac038386a12ab363c54b43dda813450f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af240c7e7c3d943439a78da12fbc58a79"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#af240c7e7c3d943439a78da12fbc58a79">PreparePsProcessing</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> h_ps_d, const FIXP_DBL *const *const rIntBufferLeft, const FIXP_DBL *const *const iIntBufferLeft, const int scaleFactorLowBand)</td></tr>
<tr class="memdesc:af240c7e7c3d943439a78da12fbc58a79"><td class="mdescLeft">&#160;</td><td class="mdescRight">Feed delaylines when parametric stereo is switched on.  <a href="psdec_8cpp.html#af240c7e7c3d943439a78da12fbc58a79">More...</a><br /></td></tr>
<tr class="separator:af240c7e7c3d943439a78da12fbc58a79"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af7d799764593b72342de1bfb3c6cb5f0"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#af7d799764593b72342de1bfb3c6cb5f0">initSlotBasedRotation</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> h_ps_d, int env, int usb)</td></tr>
<tr class="separator:af7d799764593b72342de1bfb3c6cb5f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7a1c6548643a0eae1fd1128637779d8f"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="psdec_8cpp.html#a7a1c6548643a0eae1fd1128637779d8f">ApplyPsSlot</a> (<a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> h_ps_d, FIXP_DBL **rIntBufferLeft, FIXP_DBL **iIntBufferLeft, FIXP_DBL *rIntBufferRight, FIXP_DBL *iIntBufferRight, const int scaleFactorLowBand_no_ov, const int scaleFactorLowBand, const int scaleFactorHighBand, const int lsb, const int usb)</td></tr>
<tr class="memdesc:a7a1c6548643a0eae1fd1128637779d8f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Applies IID, ICC, IPD and OPD parameters to the current frame.  <a href="psdec_8cpp.html#a7a1c6548643a0eae1fd1128637779d8f">More...</a><br /></td></tr>
<tr class="separator:a7a1c6548643a0eae1fd1128637779d8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>parametric stereo decoder </p>
</div><h2 class="groupheader">Function Documentation</h2>
<a id="a7a1c6548643a0eae1fd1128637779d8f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7a1c6548643a0eae1fd1128637779d8f">&#9670;&nbsp;</a></span>ApplyPsSlot()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void ApplyPsSlot </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a>&#160;</td>
          <td class="paramname"><em>h_ps_d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">FIXP_DBL **&#160;</td>
          <td class="paramname"><em>rIntBufferLeft</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">FIXP_DBL **&#160;</td>
          <td class="paramname"><em>iIntBufferLeft</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">FIXP_DBL *&#160;</td>
          <td class="paramname"><em>rIntBufferRight</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">FIXP_DBL *&#160;</td>
          <td class="paramname"><em>iIntBufferRight</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>scaleFactorLowBand_no_ov</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>scaleFactorLowBand</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>scaleFactorHighBand</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>lsb</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>usb</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Applies IID, ICC, IPD and OPD parameters to the current frame. </p>
<dl class="section return"><dt>Returns</dt><dd>none </dd></dl>
<p>The 64-band QMF representation of the monaural signal generated by the SBR tool is used as input of the PS tool. After the PS processing, the outputs of the left and right hybrid synthesis filterbanks are used to generate the stereo output signal.</p>
<pre>

           -------------            ----------            -------------
          | Hybrid      | M_n[k,m] |          | L_n[k,m] | Hybrid      | l[n]
 m[n] ---&gt;| analysis    |---------&gt;|          |---------&gt;| synthesis   |-----&gt;
           -------------           | Stereo   |           -------------
                 |                 | recon-   |
                 |                 | stuction |
                |/                |          |
           -------------           |          |
          | De-         | D_n[k,m] |          |
          | correlation |---------&gt;|          |
           -------------           |          |           -------------
                                   |          | R_n[k,m] | Hybrid      | r[n]
                                   |          |---------&gt;| synthesis   |-----&gt;
 IID, ICC ------------------------&gt;|          |          | filter bank |
(IPD, OPD)                          ----------            -------------

m[n]:      QMF represantation of the mono input
M_n[k,m]:  (sub-)sub-band domain signals of the mono input
D_n[k,m]:  decorrelated (sub-)sub-band domain signals
L_n[k,m]:  (sub-)sub-band domain signals of the left output
R_n[k,m]:  (sub-)sub-band domain signals of the right output
l[n],r[n]: left/right output signals

</pre><p>Hybrid analysis filterbank: The lower 3 (5) of the 64 QMF subbands are further split to provide better frequency resolution. for PS processing. For the 10 and 20 stereo bands configuration, the QMF band H_0(w) is split up into 8 (sub-) sub-bands and the QMF bands H_1(w) and H_2(w) are spit into 2 (sub-) 4th. (See figures 8.20 and 8.22 of ISO/IEC 14496-3:2001/FDAM 2:2004(E) )</p>
<p>Decorrelation: By means of all-pass filtering and delaying, the (sub-)sub-band samples s_k(n) are converted into de-correlated (sub-)sub-band samples d_k(n).</p><ul>
<li>k: frequency in hybrid spectrum</li>
<li>n: time index</li>
</ul>
<p>Stereo Processing: The sets of (sub-)sub-band samples s_k(n) and d_k(n) are processed according to the stereo cues which are defined per stereo band.</p>
<p>Hybrid synthesis filterbank: The stereo processed hybrid subband signals l_k(n) and r_k(n) are fed into the hybrid synthesis filterbanks which are identical to the 64 complex synthesis filterbank of the SBR tool. The input to the filterbank are slots of 64 QMF samples. For each slot the filterbank outputs one block of 64 samples of one reconstructed stereo channel. The hybrid synthesis filterbank is computed seperatly for the left and right channel.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">h_ps_d</td><td>handle <a class="el" href="struct_p_s___d_e_c.html">PS_DEC</a> </td></tr>
    <tr><td class="paramname">rIntBufferLeft</td><td>real bands left qmf channel (38x64) </td></tr>
    <tr><td class="paramname">iIntBufferLeft</td><td>imag bands left qmf channel (38x64) </td></tr>
    <tr><td class="paramname">rIntBufferRight</td><td>real bands right qmf channel (38x64) </td></tr>
    <tr><td class="paramname">iIntBufferRight</td><td>imag bands right qmf channel (38x64) </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ababc9e121d8507eadfe0d3603c5267ca"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ababc9e121d8507eadfe0d3603c5267ca">&#9670;&nbsp;</a></span>CreatePsDec()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int CreatePsDec </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> *&#160;</td>
          <td class="paramname"><em>h_PS_DEC</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>aacSamplesPerFrame</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Creates one instance of the <a class="el" href="struct_p_s___d_e_c.html">PS_DEC</a> struct. </p>
<dl class="section return"><dt>Returns</dt><dd>Error info </dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">h_PS_DEC</td><td>pointer to the module state </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ac038386a12ab363c54b43dda813450f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ac038386a12ab363c54b43dda813450f0">&#9670;&nbsp;</a></span>DeletePsDec()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int DeletePsDec </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a> *&#160;</td>
          <td class="paramname"><em>h_PS_DEC</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Delete one instance of the <a class="el" href="struct_p_s___d_e_c.html">PS_DEC</a> struct. </p>
<dl class="section return"><dt>Returns</dt><dd>Error info </dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">h_PS_DEC</td><td>pointer to the module state </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="af7d799764593b72342de1bfb3c6cb5f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af7d799764593b72342de1bfb3c6cb5f0">&#9670;&nbsp;</a></span>initSlotBasedRotation()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void initSlotBasedRotation </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a>&#160;</td>
          <td class="paramname"><em>h_ps_d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>env</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>usb</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<h3>type 'A' rotation </h3>
<p>mixing procedure R_a, used in baseline version<br  />
</p>
<p>Scale-factor vectors c1 and c2 are precalculated in initPsTables () and stored in scaleFactors[] and scaleFactorsFine[] = pScaleFactors []. From the linearized IID parameters (intensity differences), two scale factors are calculated. They are used to obtain the coefficients h11... h22.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">h_ps_d</td><td>pointer to the module state </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="af240c7e7c3d943439a78da12fbc58a79"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af240c7e7c3d943439a78da12fbc58a79">&#9670;&nbsp;</a></span>PreparePsProcessing()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void PreparePsProcessing </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a>&#160;</td>
          <td class="paramname"><em>h_ps_d</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const FIXP_DBL *const *const&#160;</td>
          <td class="paramname"><em>rIntBufferLeft</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const FIXP_DBL *const *const&#160;</td>
          <td class="paramname"><em>iIntBufferLeft</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const int&#160;</td>
          <td class="paramname"><em>scaleFactorLowBand</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>Feed delaylines when parametric stereo is switched on. </p>
<dl class="section return"><dt>Returns</dt><dd></dd></dl>

</div>
</div>
<a id="aa421edb192cb1475e561cb7086d72f2a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa421edb192cb1475e561cb7086d72f2a">&#9670;&nbsp;</a></span>ResetPsDec()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">SBR_ERROR ResetPsDec </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="struct_p_s___d_e_c.html">HANDLE_PS_DEC</a>&#160;</td>
          <td class="paramname"><em>h_ps_d</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p>resets some values of the PS handle to default states </p>
<dl class="section return"><dt>Returns</dt><dd></dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramname">h_ps_d</td><td>pointer to the module state </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
</small></address>
</body>
</html>
